assume cs:codesg
datasg segment 
db "Beginner's All-purpose Symbolic Instruction Code.",0 ;注意0结尾
db 50 dup (0)                ;在字符串结尾增加50字节的空间，并初始化为0
datasg ends
codesg segment
begin:  mov ax, datasg
        mov ds, ax          ;初始化ds
        mov si, 0           ;ds：si指向字符串的首地址
        mov di, 50          ;ds：di指向结果检测字符串的首地址
        call letterc        ;调用子程序
        mov ax, 4c00H
        int 21H
letterc:    push ax
            push si         ;保存寄存器变量的值
            push di         ;新增  
    comp:   mov al, [si]    ;将字符读入al中
            cmp al, 0       ;检测字符是否为0，字符串结尾检测
            je exit         ;如果为0，跳转到exit标号，退出
            cmp al, 'a'     ;与小写字母a比较
            jb next_char    ;如果小于字符a，跳转到下个字符
            cmp al, 'z'     ;与小写字母z比较
            ja next_char    ;如果大于字符z，跳转到下个字符
            and al, 11011111B   ;条件都不满足，开始转换为大写字母
    next_char:                  ;下一个字符，递增si，跳转到comp标号
            mov [di], al        ;将转换后字符写入到结果内存单元中。
            inc di              ;新增
            inc si
            jmp short comp
    exit:   pop di      ;新增
            pop si
            pop ax      ;恢复寄存器变量值
            ret
codesg ends
end begin